mysql学习 |
您所在的位置:网站首页 › mysql 双一 › mysql学习 |
一般小型公司数据库,使用主从复制即可保证数据库的高可用,但是一旦主数据库故障,切换到从库需要一定的时间,这样就导致了停机时间过长,不能及时恢复业务。使用双主(master)配合keepalived这种mysql高可用架构也是基于主从复制的原理而搭建的。这是一种简单、便捷的解决方案,在高可用集群环境中,keepalived使用vip,利用keepalived自带的服务监控功能和自定义脚本来实现mysql故障时自动切换。 1、mysql双主复制介绍双主复制,就是相互做主从复制,每个master既是master又是另外一台服务器的slave。这样,任何一方所做的变更,都会通过复制应用到另外一方的数据库中。
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog; SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致; 主从复制重点: 1)主从复制是异步的逻辑的sql语句级的复制 2)复制时,主库有一个I/O线程,从库有有两个线程,即I/O和SQL线程。 3)实现主从复制的必要条件是主库需要开启binlog功能 4)作为复制的所有mysql节点的server-id都不能相同 5)binlog文件只记录对数据库有更改的sql语句,不记录任何查询语句。 大致的逻辑流程图如下所示:
Keepalived 是一个基于 vrrp 协议来实现的服务器高可用解决方案,可以利用其实现避免IP单点故障,类似的工具还有 heartbeat 、 corosync 。不过其不会单独出现,而是搭配着 LVS、Nginx、HAproxy,一起协同工作达到高可用的目的 VRRP 全称Vritual Router Redundancy Protocol,虚拟路由冗余协议。通过把几台提供路由功能的设备组成一个虚拟路由设备,使用一定的机制保证虚拟路由的高可用,从而达到保持业务的连续性与可靠性。 在这组成的一个虚拟路由器中,有 master 和 backup 之分。master是主节点,在一个虚拟路由器中,只能有一个master,但可以有多个backup;backup是备用节点,也就是当master挂掉之后,backup接手master节点的所有资源,当有多个backup节点时,根据其 priority (优先级)的值的大小,来选择谁作为master的替代者。当backup节点的优先级值相同时,根据其IP地址的大小,来决定。
工作原理图
基于社区版myql8.0进行实验
172.31.208.123 主master A,
172.31.208.124 备库 master B
vip 172.31.208.125
架构原理如下所示:
要是实现主主复制,就是在主从复制的基础上配置相互为主从 数据库主master A,配置文件如下所示,/etc/my.cnf server-id = 1 #任意自然n,只需要保证两台mysql主机不重复就可以 log-bin=mysql-bin #开启二进制日志 auto_increment_increment=2 #步进值auto_imcrement 。一般有n台主mysql就填n auto_increment_offset=1 #起始值,一般填写第n台主机mysql.此时为第一台主 mysql #binlog-ignore=mysql #忽略mysql库,可以不填写 #binlog-ignore=infomation_schema #忽略information_schema库,一般不填写 replicate-do-db=test_db #指定同步的数据库,不填写则默认所有的数据库数据库主master B,配置文件如下所示,/etc/my.cnf server-id = 2 log-bin=mysql-bin auto_increment_increment=2 auto_increment_offset=2 #binlog-ignore=mysql #binlog-ignore=infomation_schema replicate-do-db=test_db完成配置后,重启mysql 3.3 主库masterA主从配置然后开始创建复制用户,repel,密码repel 主库master A create user 'repl'@'172.31.208.124' identified with mysql_native_password by 'mysqlP@ssw0rd'; #创建用户 mysql.0中密码需要填写mysql_native_password grant replication slave on *.* to 'repl'@'172.31.208.124'; #分配权限 flush privileges; #刷新权限然后查看账户是否权限分配正确 show grants for 'repl'@'172.31.208.124';
登陆masterB数据库,执行同步语句 mysql> change master to -> master_host='172.31.208.123', -> master_user='repl', -> master_password='mysqlP@ssw0rd', -> master_log_file='mysql-bin.000001', -> master_log_pos=896;然后启动slave同步进程 mysql> start slave;然后检查slave状态 show slave status\G
基本跟主库masterA配置方式一样 创建用户repl分配权限 mysql> create user 'repl'@'172.31.208.123' identified with mysql_native_password by 'mysqlP@ssw0rd'; mysql> grant replication slave on *.* to 'repl'@'172.31.208.123'; mysql> flush privileges;查看masterB的状态
然后启动slave同步,检查slave状态· mysql>start slave; mysql>show slave status\G
主库masterA上创建test_db,并创建表product mysql> create table product( -> product_id int(10) not NULL, -> product_name varchar(100) not NULL, -> product_tyep varchar(32) not NULL, -> sale_price int(10) default 0, -> input_price int(10) default 0, -> regist_time date, -> primary key (product_id) -> );masterB上查看 mysql> show databases; mysql> use test_db; mysql> show tables; mysql> desc product;
然后备库masterB上创建test_db库中的表product_new,然后再masterA上查看 mysql> create table product_new( -> product_id int(10) not NULL, -> product_name varchar(100) not NULL, -> product_tyep varchar(32) not NULL, -> sale_price int(10) default 0, -> input_price int(10) default 0, -> regist_time date, -> primary key (product_id) -> );masterA上查看
注意事项 1、主主复制配置文件中auto_increment_increment和auto_increment_offset只能保证主键不重复,却不能保证主键有序。 2、当配置完成Slave_IO_Running、Slave_SQL_Running不全为YES时,show slave status\G信息中有错误提示,可根据错误提示进行更正。 3、Slave_IO_Running、Slave_SQL_Running不全为YES时,大多数问题都是数据不统一导致。 4、两个数据库最好软件硬件等规格配置要一致 常见出错点: 1、两台数据库都存在db数据库,而第一台MySQL db中有tab1,第二台MySQL db中没有tab1,那肯定不能成功。 2、已经获取了数据的二进制日志名和位置,又进行了数据操作,导致POS发生变更。在配置CHANGE MASTER时还是用到之前的POS。 3、stop slave后,数据变更,再start slave。出错。 终极更正法:重新执行一遍CHANGE MASTER就好了。 4、配置keepalived两台数据库,使用yum安装keepalived的软件包 yum install -y keepalived在配置前,要确保两边时间一致,可以用ntp chrony等工具进行时间同步
同时关闭防火墙和相关配置,保证两边心跳
然后确认网卡多播支持
安装keepalived后,检查版本
以下为masterB的配置文件 script "keepalived_check_mysql.sh" interval 10 } vrrp_instance VI_1 { nopreempt state BACKUP interface ens192 virtual_router_id 51 priority 100 advert_int 5 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.31.208.125/24 dev ens192 label ens192:1 } track_script { check_mysql_status } }说明: 1、总体配置和其他keepalived配置一致 2、使用双主,状态都要配置成backup状态,并且使用非抢占模式,通过优先级来判断谁是主库,避免裂闹,冲突 注意,默认情况下,keepalived软件仅仅在对方机器宕机或者keepalive停掉的时候才会接管业务。有时mysql服务停止,但是keepalived服务还在工作,此时就会导致用户的访问的vip无法找到对应的服务,所以需要编写脚本,检测mysql服务状态,当服务中断时,keepalive服务也中断,这里的keepalived_check_mysql.sh脚本的作用就是这样。脚本如下,保存在主maserA和备masterB的/etc/keepalived/路径下 #!/bin/bash #for centos7 mysqlstr=/usr/sbin/mysqld user=user password=ctbtP@ssw0rd ##mysql服务状态正常为1,否则为0 #mysql_status=1 ####check mysql status###### $mysqlstr -u $user -p$password -e "show status;" >/dev/null 2>&1 #执行成功,代表数据库服务正常 echo "mysql_status=1" exit 0 else systemctl stop mysqld fi记得加上可执行权限 配置完成后,分别启动masterA和masterB的keepalived服务 systemctl start keepalived systemctl enable keepalvied注意,当配置文件有任何错误的时候,systemctl 不会提示keepalived启动失败,需要使用systemclt status检查服务
当配置正确主masterA会有vip
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |